package com.master.demo.example.java8;

import com.master.demo.example.entity.Person;

import java.util.Optional;

/**
 * Optional类判断null值处理
 *
 * @author: Yang
 * @date: 2022/1/6
 * @version: 1.0.0
 * Copyright Ⓒ 2021 Master Computer Corporation Limited All rights reserved.
 */
public class OptionalExample {

    public static void main(String[] args) {
        createOpt();
    }

    /**
     * 创建Optional对象
     */
    private static void createOpt() {
        //empty()方法创建的对象没有值，如果对emptyOpt变量调用isPresent()方法会返回false，调用get()方法抛出NullPointerException异常。
        Optional<String> emptyOpt = Optional.empty();
        // of()方法使用一个非空的值创建Optional对象
        String str = "Hello World";
        Optional<String> notNullOpt = Optional.of(str);
        // ofNullable()方法接收一个可以为null的值
        Optional<String> nullableOpt = Optional.ofNullable(str);
    }

    /**
     * 获取Optional对象
     */
    private static void getOpt() {
        Person person = new Person();
        // 常规方式
        String area = null;
        if (person != null) {
            area = person.getArea();
        }
        // 使用Optional中提供的map()方法
        Optional<Person> userOpt = Optional.ofNullable(person);
        Optional<String> areaOpt = userOpt.map(Person::getArea);
    }

    /**
     * 使用orElse()方法获取值
     * orElse()：如果有值就返回，否则返回一个给定的值作为默认值；
     * orElseGet()：与orElse()方法作用类似，区别在于生成默认值的方式不同。该方法接受一个Supplier<? extends T>函数式接口参数，用于生成默认值；
     * orElseThrow()：与前面介绍的get()方法类似，当值为null时调用这两个方法都会抛出NullPointerException异常，区别在于该方法可以指定抛出的异常类型。
     */
    private static void getOptOrElse() {
        Optional<String> strOpt = Optional.of("Hello World");
        String orElseResult = strOpt.orElse("Hello Shanghai");
        String orElseGet = strOpt.orElseGet(() -> "Hello Shanghai");
        String orElseThrow = strOpt.orElseThrow(
                () -> new IllegalArgumentException("Argument 'str' cannot be null or blank."));
        //ifPresent()方法 打印
        strOpt.ifPresent(System.out::println);
        // 过滤
        strOpt = strOpt.filter(str -> str.contains("He"));
        System.out.println(strOpt);
    }

    /**
     * 简化if-else案例
     *
     * @return
     */
    private static String example() {
        //常规写法
        Person person = new Person();
        if (person != null) {
            String name = person.getName();
            if (name != null) {
                return name.toUpperCase();
            } else {
                return null;
            }
        }

        //使用Optional类
        return Optional.ofNullable(person).map(Person::getName)
                .map(String::toUpperCase)
                .orElse(null);
    }


}
